// code dont on veut permettre l'accès à distance

import java.rmi.server.UnicastRemoteObject ;
import java.rmi.RemoteException ;
import java.util.Hashtable;
import java.util.*;

public class Serveur_Impl extends UnicastRemoteObject implements Serveur_Itf  
{    
	Hashtable listeClients = new Hashtable();
	int idProchainClient;
	String sender;

	public Serveur_Impl () throws RemoteException 
	{
		super();
		System.out.println("Serveur prêt");
		idProchainClient = 0;
	};

	public int addList(Client_Itf c) throws RemoteException 
	{ 
		idProchainClient++;
		String key = "" + idProchainClient;
		
		listeClients.put(key, c);
		System.out.println("Ajout du client " + key);
		
		return idProchainClient;
	}

	public void getVoisins(int id) throws RemoteException
	{
		int indice = -1;
		int nbVoisins = 0;

		Hashtable sesVoisins = new Hashtable();										// liste des voisins du client
		Client_Itf c = (Client_Itf) listeClients.get("" + id);
		
		if(listeClients.size() > 1)													// s'il y a au moins deux clients
		{			
			nbVoisins = ((int) (Math.random()*(listeClients.size()-1)))+1; 			// entre [0;listeClientSize-1[ + 1 = entre [1;listeCientSize-1]
			
			System.out.println("\tNombre de voisins à attribuer : " + nbVoisins);

			for(int i=0; i<nbVoisins; i++)
			{
				do
				{
					//random : 0.0 <= rand < 1.0
					//random * size-1 : 0.0 <= rand < size-1
					//+1 -> 1<= < size
					indice = (int) (Math.random()*(listeClients.size()-1) +1);			// indice du client à ajouter dans les voisins de c
				}
				while(indice == id || sesVoisins.containsKey(indice)); 				// tant que c'est lui-meme ou qqun qu'il a déjà
			
				System.out.println("\tVoisin attribué : " + indice);
				sesVoisins.put(indice, indice);
			
				Client_Itf cl = (Client_Itf)listeClients.get("" + indice);
			
				//System.out.print("cl = "+cl);
			
				c.addVoisinConnection(cl, indice);
			}
		}
	}
	
	public void iSend(String ip, String port) throws RemoteException
	{
		sender = ip + "/" + port;
	}
	
	public String iReceive() throws RemoteException
	{
		return sender;
	}
}

